This closes a drift gap possibility.
Signed-off-by: Colin Walters <walters@verbum.org>
char **_ostree_deployment_get_overlay_initrds (OstreeDeployment *self);
+OstreeKernelArgs *_ostree_deployment_get_kargs (OstreeDeployment *self);
+
G_END_DECLS
#include "config.h"
+#include "ostree-bootconfig-parser.h"
#include "ostree-deployment-private.h"
#include "ostree.h"
#include "otutil.h"
{
return self->soft_reboot_target;
}
+
+/**
+ * ostree_deployment_get_kargs:
+ * @self: Deployment
+ *
+ * Returns: (transfer full) (nullable): Kernel arguments
+ */
+OstreeKernelArgs *
+_ostree_deployment_get_kargs (OstreeDeployment *self)
+{
+ OstreeBootconfigParser *bootcfg = ostree_deployment_get_bootconfig (self);
+ if (!bootcfg)
+ return NULL;
+ const char *kargs = ostree_bootconfig_parser_get (bootcfg, "options");
+ if (!kargs)
+ return NULL;
+ return ostree_kernel_args_from_string (kargs);
+}
#pragma once
#include "ostree-bootconfig-parser.h"
+#include "ostree-types.h"
G_BEGIN_DECLS
void _ostree_kernel_args_entry_value_free (OstreeKernelArgsEntry *e);
+gboolean _ostree_kernel_args_equal (OstreeKernelArgs *a, OstreeKernelArgs *b);
+
G_END_DECLS
return ostree_kernel_args_delete (kargs, arg, error);
return TRUE;
}
+
+gboolean
+_ostree_kernel_args_equal (OstreeKernelArgs *a, OstreeKernelArgs *b)
+{
+ if (a == b)
+ return TRUE;
+ if (a == NULL || b == NULL)
+ return FALSE;
+ if (a->order->len != b->order->len)
+ return FALSE;
+ for (guint i = 0; i < a->order->len; i++)
+ {
+ OstreeKernelArgsEntry *entry_a = g_ptr_array_index (a->order, i);
+ OstreeKernelArgsEntry *entry_b = g_ptr_array_index (b->order, i);
+ if (!g_str_equal (entry_a->key, entry_b->key))
+ return FALSE;
+ if (g_strcmp0 (entry_a->value, entry_b->value) != 0)
+ return FALSE;
+ }
+ return TRUE;
+}
G_BEGIN_DECLS
-typedef struct _OstreeKernelArgs OstreeKernelArgs;
-
_OSTREE_PUBLIC
void ostree_kernel_args_free (OstreeKernelArgs *kargs);
#include "libglnx.h"
#include "ostree-core-private.h"
#include "ostree-deployment-private.h"
+#include "ostree-kernel-args-private.h"
#include "ostree-linuxfsutil.h"
#include "ostree-repo-private.h"
#include "ostree-sepolicy-private.h"
ostree_sysroot_deployment_can_soft_reboot (OstreeSysroot *self, OstreeDeployment *deployment)
{
OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (self);
- if (booted_deployment != NULL)
- {
- const char *booted_bootcsum = ostree_deployment_get_bootcsum (booted_deployment);
- const char *target_bootcsum = ostree_deployment_get_bootcsum (deployment);
- return g_str_equal (booted_bootcsum, target_bootcsum);
- }
- return false;
+ if (booted_deployment == NULL)
+ return FALSE;
+
+ const char *booted_bootcsum = ostree_deployment_get_bootcsum (booted_deployment);
+ const char *target_bootcsum = ostree_deployment_get_bootcsum (deployment);
+ if (!g_str_equal (booted_bootcsum, target_bootcsum))
+ return FALSE;
+
+ g_autoptr (OstreeKernelArgs) booted_kargs = _ostree_deployment_get_kargs (booted_deployment);
+ g_assert (booted_kargs);
+
+ g_autoptr (OstreeKernelArgs) target_kargs = _ostree_deployment_get_kargs (deployment);
+ // The target kargs can be unset, which means use the merge kargs (same as booted, usually)
+ if (!target_kargs)
+ return TRUE;
+
+ // Compare kargs without the ostree= entry, as that will vary per bootlink even for
+ // the same boot checksum.
+ g_assert (ostree_kernel_args_delete (booted_kargs, "ostree", NULL));
+ g_assert (ostree_kernel_args_delete (target_kargs, "ostree", NULL));
+ return _ostree_kernel_args_equal (booted_kargs, target_kargs);
}
static void
typedef struct OstreeRepoFile OstreeRepoFile;
typedef struct _OstreeContentWriter OstreeContentWriter;
typedef struct OstreeRemote OstreeRemote;
+typedef struct _OstreeKernelArgs OstreeKernelArgs;
G_END_DECLS
fatal "soft reboot prep with kernel change"
fi
assert_file_has_content_literal err.txt "different kernel state"
+ rm -vf err.txt
+
+ rpm-ostree cleanup -p
+
+ rpm-ostree kargs --append=foo=bar
+ if ostree admin prepare-soft-reboot 0 2>err.txt; then
+ fatal "soft reboot prep with kernel args change"
+ fi
+ assert_file_has_content_literal err.txt "different kernel state"
echo "ok soft reboot all tests"
;;